package com.example.shoppingmall.shoppingcart.utils;

import android.content.Context;
import android.text.TextUtils;
import android.util.SparseArray;

import com.example.shoppingmall.app.MyApplication;
import com.example.shoppingmall.base.GoodsBean;
import com.example.shoppingmall.utils.CacheUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;
import java.util.List;

// 购物车存储器类
public class CartStorage {
    public static final String JSON_CART = "json_cart";
    // 单列模式
    private static CartStorage instance;
    private final Context mContext;
    // todo 不懂 sparseArray 安卓的控件
    // SparseArray 的性能优于Hashmap
    // 内存返回数据 用SpareseArray
    private SparseArray<GoodsBean> sparseArray;
    // 构造方法
    private CartStorage(Context context){

        this.mContext = context;
        // 读取本地数据 把之前存储的数据读取
        sparseArray = new SparseArray<>(100);
        
        lisToSparseArray();

    }

    /**
     *  从本地读取的数据加入到SparseArray中
     * */

    private void lisToSparseArray() {
        List<GoodsBean> goodsBeanList = getAllData();
        // 把list数据转换未SparseArray
        for (int i =0;i<goodsBeanList.size();i++){
            GoodsBean goodsBean = goodsBeanList.get(i);
            sparseArray.put(Integer.parseInt(goodsBean.getProduct_id()),goodsBean);
        }
    }
    /**
     *  获取本地所有的数据
     * */
    public List<GoodsBean> getAllData() {
        List<GoodsBean> goodsBeanList = new ArrayList<>();
        // 1. 从本都获取
        String json = CacheUtils.getString(mContext, JSON_CART);
        // 2.使用Gson转换成列表
        // 判断不为空的时候执行
        if(!TextUtils.isEmpty(json)){
            goodsBeanList = new Gson().fromJson(json,new TypeToken<List<GoodsBean>>(){}.getType());
        }
        return goodsBeanList;
    }


    /**
   * 得到购车实例
   * */
    public static CartStorage getInstance(){
        if(instance == null){
            instance = new CartStorage(MyApplication.getContext());
        }
        return instance;
    }
    /**
     *  添加数据
     * */
    public void addDete(GoodsBean goodsBean){
        // 1.添加到内存中SpareseArray
        // 如果当前数据已存在，就修改成number 递增
        GoodsBean tempData = sparseArray.get(Integer.parseInt(goodsBean.getProduct_id()));
        if(tempData != null){
            // 内存中有了这条数据
            tempData.setNumber(tempData.getNumber() +1);
        }else{
            tempData = goodsBean;
        }

        // 同步到内存中
        sparseArray.put(Integer.parseInt(tempData.getProduct_id()),goodsBean);
        //2.同步到本地
        saveLocal();

    }
    /**
     * 删除数据
     * */

    public void deleteDete(GoodsBean goodsBean){
        // 1.内存中删除
        sparseArray.delete(Integer.parseInt(goodsBean.getProduct_id()));
        // 2.把内存的保存到本地
        saveLocal();

    }
    /**
     * 修改数据
     * */

    public void updateDete(GoodsBean goodsBean){
        // 1.内存中更新
        sparseArray.put(Integer.parseInt(goodsBean.getProduct_id()),goodsBean);
        // 2.把内存的保存到本地
        saveLocal();

    }
    /**
     * 保存数据到本地
     * */
    private void saveLocal() {

        // 1.SparseArray转换成list
        List<GoodsBean> goodsBeanList = sparseToList();
        // 2.使用gson把列表转换成string类型
        String json = new Gson().toJson(goodsBeanList);
        // 3.把string数据保存
        CacheUtils.saveString(mContext,JSON_CART,json);
    }

    private List<GoodsBean> sparseToList() {
        List<GoodsBean> goodsBeanList = new ArrayList<>();
        for(int i =0;i<sparseArray.size();i++){
            GoodsBean goodsBean = sparseArray.valueAt(i);
            goodsBeanList.add(goodsBean);
        }
        return goodsBeanList;
    }
}
